package com.zengqingfa.designpattern.create.singleton;

import java.io.*;

/**
 * @fileName: Singleton1
 * @author: zengqf3
 * @date: 2021-4-5 21:00
 * @description: 静态初始化实现单例（饿汉式）
 * <p>
 * 单例模式（Singleton Pattern）是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式。
 * <p>
 * 这种模式涉及到一个单一的类，该类负责创建自己的对象，同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式，可以直接访问，不需要实例化该类的对象。
 * <p>
 * 注意：
 * 1、单例类只能有一个实例。
 * 2、单例类必须自己创建自己的唯一实例。
 * 3、单例类必须给所有其他对象提供这一实例。
 * <p>
 * 意图：保证一个类仅有一个实例，并提供一个访问它的全局访问点。
 * 主要解决：一个全局使用的类频繁地创建与销毁。
 * 何时使用：当您想控制实例数目，节省系统资源的时候。
 * 如何解决：判断系统是否已经有这个单例，如果有则返回，如果没有则创建。
 * 关键代码：构造函数是私有的。
 */
public class Singleton1 implements Serializable {

    /**
     * 构造函数私有
     */
    private Singleton1() {

    }

    /**
     * 静态初始化
     */
    public static Singleton1 instance = new Singleton1();

    /**
     * 获取实例
     *
     * @return
     */
    public static Singleton1 getInstance() {
        return instance;
    }

    private Object readResolve() {
        return instance;
    }

    public static void main(String[] args) throws Exception {
        Singleton1 singleton1 = Singleton1.getInstance();
        //输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton1File"));
        // 序列化
        oos.writeObject(singleton1);

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("singleton1File"));
        //反序列化
        Singleton1 newSingleton1 = (Singleton1) ois.readObject();

        //com.zengqingfa.designpattern.create.singleton.Singleton1@378bf509
        System.out.println(singleton1);
        //com.zengqingfa.designpattern.create.singleton.Singleton1@378bf509
        System.out.println(newSingleton1);
        //true
        System.out.println(singleton1 == newSingleton1);
    }
}
